package OOM;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;

/**
 * VM args: --XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=10m
 * （笔者使用JDK1.8测试，由于JDK1.8的class加载对象存贮在元空间中，我们把元空间改小一些）
 * <p>
 * 在方法区中，存贮的都是类的加载信息，静态常量等信息。当运行时常量池内容过多时，就出现OOM。
 * 有了这个思路，我们可以使用CGLIB代理来生成大量的代理对象，来导致OOM。
 * 其中要额外用到两个CGlib的jar包，可以去maven仓库里面找下，导入到项目的依赖中
 *
 * @author caihe
 * @date 2021/11/1 15:05
 */
public class MethodAreaOOM {
    static class OOMObject {
    }

    public static void main(String[] args) {
        while (true) {
            Enhancer enhancer = new Enhancer();

            enhancer.setSuperclass(OOMObject.class);
            enhancer.setUseCache(false);
            enhancer.setCallback((MethodInterceptor) (o, method, objects, methodProxy) ->
                    methodProxy.invoke(o, objects));

            enhancer.create();
        }

    }

}
